/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：LR0.h
 * 模块功能说明：
 * 该模块实现LR0相关分析，定义生成LR0内容的各种函数，并构建LR0状态表和转移表，在生成LR0的过程中判断是否为SLR1文法。
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#ifndef LR0_H
#define LR0_H

#include <QString>
#include <QStringList>
#include <QVector>
#include <QSet>
#include <QHash>
#include <QDebug>
#include "utils.h"

//LR0的单个状态
struct LR0_state{
    QSet<Item> st;  //地图是有魔法的

    static LR0_state closure(LR0_state I, QHash<QString, QSet<QStringList>> grammars, QVector<QString> nonFinalizers, QHash<QString, QSet<QString>> first_set);//求闭包

    static LR0_state change(LR0_state I, QString X, QHash<QString, QSet<QStringList>> grammars, QVector<QString> nonFinalizers, QHash<QString, QSet<QString>> first_set);

    friend bool operator==(const LR0_state& a, const LR0_state& b) {
        return a.st == b.st;
    }
};

size_t qHash(const LR0_state& key);

class LR0       //构建lr0
{
public:
    LR0():size(0){};
    int size;

    QHash<LR0_state,int> state_hash;
    QHash<int,QHash<QString,int>> change_hash;

    void buildLR0(LR0_state first_state, QHash<QString, QSet<QStringList>> grammars, QVector<QString> nonFinalizers,
                  QHash<QString, QSet<QString>> first_set, QHash<QString, QSet<QString>> follow_set);

    bool is_SLR1(QHash<QString, QSet<QString>> follow_set);
    QString SLR1(QHash<QString, QSet<QString>> follow_set);
};


#endif // LR0_H
